package com.seafwg;

/**
 * @Author seafwg
 * @Date 2022/7/28 00:10
 * @Version 1.0
 * @Description 线程通信：
 *
 * eg:使用两个线程打印1-100，线程1，线程2，交替打印
 * 原理：昂操作完共享数据时，让当前线程堵塞，使用"同步监视器对象调用wait()"方法计入堵塞状态，
 *      并且开启同步监视器，让下一个线程进入同步代码块，调用"同步监视器的notify()/notifyAll()"方法
 *      让进来的进入线程就绪状态，同时上一个线程执行下去，交替往复。
 *
 * 涉及到的三个方法：
 *  wait():当前线程进入堵塞状态，并释放同步监视器
 *  notify():唤醒wait的线程，如果有多个wait线程，则唤醒优先级比较高的线程
 *  notifyAll():唤醒所有wait的线程
 *
 * 说明：
 *  1.三个方法属于Object类，定义在java.lang.Object类中[由于同步监视器诗人一对象，Object是所有类的顶层类]
 *  2.三个方法必须出现在同步代码块或者同步方法中；并且具有同一个"同步监视器"对象，
 *      否则会出现非法的监视器状态异常：IllegalMonitorStateException
 *
 * sleep()和wait()方法的区别：
 *  相同点：都可以使得当前线程进入堵塞状态
 *  不同点：
 *                               sleep                      wait
 *      1.所属的类不同：           Thread类                  Object类
 *      2.使用场景：           任何场景，Thread调用      只能是同步机制中，并且由同步监视器调用
 *      3.是否释放同步监视器    不会释放，和同步机制无关      会释放同步监视器
 */

public class ThreadCommucate {
    public static void main(String[] args) {
        ThreadReplace tr = new ThreadReplace();
        Thread t1 = new Thread(tr);
        Thread t2 = new Thread(tr);

        t1.setName("线程一");
        t2.setName("线程二");

        t1.start();
        t2.start();
    }
}

class ThreadReplace implements Runnable{

    private int num = 1;

    @Override
    public void run() {
        while (true) {
            synchronized (ThreadReplace.class) {
                ThreadReplace.class.notify();
                if (num < 101) {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + num);
                    num++;
                    try {
                        ThreadReplace.class.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}